//IO 函子的问题
const  fp = require('lodash/fp')
const fs = require('fs')

class IO {
    static of (value) {
        return new IO(function () {
            return value
        })
    }
    constructor(fn) {
        this._value = fn
    }
    // 把当前的 value 和 传入的 fn 组合成一个新的函数
    map(fn) {
        return new IO(fp.flowRight(fn, this._value))
    }
}

let readFile = function (filename) { 
        return new IO(function() { 
            return fs.readFileSync(filename, 'utf-8') }) 
    }
let print = function(x) { 
    return new IO(function() { 
        console.log(x) 
        return x }) 
    }

    // IO(IO(x)) 
    let cat = fp.flowRight(print, readFile) 
    // 调用 
    let r = cat('package.json')._value()._value() 
    console.log(r)